package com.chen.nio.zerocopy;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;

public class NewIOServer {

    public static void main(String[] args) throws IOException {
        ServerSocketChannel ssc = ServerSocketChannel.open();
        ServerSocket serverSocket = ssc.socket();
        /**
         * 当一个tcp连接被关闭的时候，连接可能还会保持一个超时的状态，	通常这个称之为TIME WAIT的状态。
         * 当一个应用连接到一个已知的socket地址和端口号，如果这个连接处于一个TCP连接的超时状态的话，那么这个应用是不可能绑定到这个SocketAddress的。
         * 那有没有办法可以绑定呢，是有的，可以在binding socket之前调用serverSocket.setReuseAddress(true)的方法的话则允许绑定SocketAddress。
         */
        serverSocket.setReuseAddress(true);
        serverSocket.bind(new InetSocketAddress(8899));
        ByteBuffer buffer = ByteBuffer.allocate(1024 * 4);
        while (true) {
            SocketChannel socketChannel = ssc.accept();
            int readCount = 0;
            while (readCount != -1) {
                readCount = socketChannel.read(buffer);
                System.out.println(readCount);
                buffer.rewind();
            }
        }
    }
}
